package com.atguigu.distributed.lock.leecode.array;

/**
 * 力扣中等238：除自身以外数组的乘积
 */
public class ProductExceptSelf {
    public int[] productExceptSelf2(int[] nums) {
        int length = nums.length;
        int[] answer = new int[length];
        //answer[i]表示索引i左侧所有元素的乘积
        //因为索引为'0'的元素左侧没有元素，所以answer[0] = 1
        answer[0] = 1;
        for (int i = 1; i < length; i++) {
            answer[i] = nums[i - 1] * answer[i - 1];
        }
        //R为右侧所有元素的乘积
        //刚开始右边没有元素，所以R = 1;
        int R = 1;
        for (int i = length - 1; i >= 0; i--) {
            //对于索引i，左边的乘积为answer[i],右边的乘积为R
            answer[i] = answer[i] * R;
            //R需要包含右边所有的乘积，所以计算下一个结果时需要将当前值乘到R上
            R *= nums[i];
        }
        return answer;
    }
}
